package com.example.demotest.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;

import java.security.Key;
import java.util.Date;

@Component//声明这是一个 Spring 组件，这样 Spring 会自动将其作为 Bean 管理并注入到需要的地方
public class JWT {
    // 建议使用至少256位的Base64密钥（这里用随机字符串生成后Base64编码
    private static final String SECRET_KEY = "bXktdmVyeS1zZWN1cmUtc2VjcmV0LWtleS1zaG91bGQtYmUtMzItY2hhcnM=";

    // 令牌有效期：7天（毫秒）
    private static final long EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 7;

    /**
     * 生成JWT令牌
     * 可用于Apipost接口测试
     */
    public static String generateToken(String username) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setSubject(username) // 保存用户名
                .setIssuedAt(now)     // 签发时间
                .setExpiration(expiryDate) // 过期时间
                .signWith(getSigningKey(), SignatureAlgorithm.HS256) // 使用密钥和算法签名
                .compact();
    }

    //新添加，给管理员生成专属的token
    public static String generateAdminToken(Integer adminId) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setSubject(String.valueOf(adminId))
                .claim("isAdmin", true)  // 关键字段
                .setIssuedAt(now)
                .setExpiration(expiryDate)
                .signWith(getSigningKey(), SignatureAlgorithm.HS256)
                .compact();
    }

    // 给骑手生成专属的 token
    public static String generateRiderToken(Integer riderId) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setSubject(String.valueOf(riderId))
                .claim("isRider", true) // 关键字段：标记为骑手身份
                .setIssuedAt(now)
                .setExpiration(expiryDate)
                .signWith(getSigningKey(), SignatureAlgorithm.HS256)
                .compact();
    }



    //新添加 验证管理员token
    public boolean isAdmin(String token) {
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();
            Boolean isAdmin = claims.get("isAdmin", Boolean.class);
            return isAdmin != null && isAdmin;
        } catch (JwtException e) {
            return false;
        }
    }

    /**
     * 解析JWT令牌，返回用户ID
     */
    public Integer getUserIdFromToken(String token) {
        Claims claims = Jwts.parser().setSigningKey(SECRET_KEY)
                .parseClaimsJws(token).getBody();
        return Integer.parseInt(claims.getSubject());
    }

    // 从 token 中获取骑手 ID
    public Integer getRiderIdFromToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
        if (Boolean.TRUE.equals(claims.get("isRider", Boolean.class))) {
            return Integer.parseInt(claims.getSubject());
        }
        throw new RuntimeException("无效的骑手 Token");
    }


    /*从请求中提取token*/
    //确保前端请求头为：Authorization: Bearer <token>
    public String extractToken(HttpServletRequest request) {
        String bearer = request.getHeader("Authorization");
        if (bearer != null && bearer.startsWith("Bearer ")) {
            return bearer.substring(7);
        }
        return null;
    }

    /**
     * 验证JWT令牌是否有效
     */
    /*
    * 作用：验证传入的 token 是否有效。
      使用 Jwts.parser() 创建 JWT 解析器。
      setSigningKey(SECRET_KEY)：指定签名时使用的密钥（即 SECRET_KEY）。
      parseClaimsJws(token)：解析 token。若 token 不合法或被篡改，会抛出 JwtException 异常。
      返回值：
      如果 token 被验证成功并且没有问题，返回 true。
      如果 token 无效或有错误，捕获异常并返回 false
    * */
    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (JwtException e) {
            return false;
        }
    }


    /**
     * 获取签名密钥
     */
    private static Key getSigningKey() {
        byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
        return Keys.hmacShaKeyFor(keyBytes);
    }

}
